Spring Boot ORM (Object-Relational Mapping) অ্যাপ্লিকেশনগুলির জন্য Unit Testing এবং Integration Testing খুবই গুরুত্বপূর্ণ। এগুলো ব্যবহার করে অ্যাপ্লিকেশনটির কার্যকারিতা এবং ডেটাবেস সংক্রান্ত কার্যক্রম সঠিকভাবে পরীক্ষা করা যায়। Spring Boot ORM অ্যাপ্লিকেশনে Unit Testing এবং Integration Testing-এর জন্য সাধারণত JUnit এবং Mockito ব্যবহার করা হয়।
Unit Testing in Spring Boot ORM
Unit Testing হল একটি নির্দিষ্ট ইউনিট বা ফাংশন (যেমন সার্ভিস ক্লাস, মেথড) পরীক্ষা করার প্রক্রিয়া। ORM অ্যাপ্লিকেশনে, সাধারণত DAO (Data Access Object) বা Repository লেয়ার টেস্ট করা হয়, যেখানে ডেটাবেস অপারেশন বা জেএপি-এর লজিক প্রক্রিয়া পরীক্ষা করা হয়। Mockito মক (Mock) অবজেক্ট ব্যবহার করে ডেটাবেস বা রেপোজিটরি লেয়ারের ওপর টেস্ট করা হয়।
১. Repository Layer এর Unit Test
Repository Layer হলো ডেটাবেস অ্যাক্সেসের অংশ, এবং এটি JUnit এবং Mockito দিয়ে টেস্ট করা হয়। এখানে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে UserRepository টেস্ট করা হচ্ছে।
Dependency for Unit Test (pom.xml):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.6.1</version>
<scope>test</scope>
</dependency>
UserRepository Interface (Repository Layer):
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
}
Unit Test (Mockito Example):
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserRepositoryTest {
@Mock
private UserRepository userRepository; // Mock Repository
@InjectMocks
private UserService userService; // Inject Mocks into Service
@Test
public void testFindByName() {
User user = new User(1L, "John Doe", "john@example.com");
when(userRepository.findByName("John Doe")).thenReturn(user);
User result = userService.findByName("John Doe");
assertEquals("John Doe", result.getName());
}
}
ব্যাখ্যা:
@Mockদিয়েUserRepositoryমক করা হয়েছে।@InjectMocksদিয়ে মক অবজেক্টকেUserServiceক্লাসে ইনজেক্ট করা হয়েছে।when(...).thenReturn(...)দিয়ে মক অবজেক্টের প্রত্যাশিত আউটপুট দেওয়া হয়েছে।assertEqualsদিয়ে টেস্টের ফলাফল যাচাই করা হয়েছে।
Integration Testing in Spring Boot ORM
Integration Testing হল একাধিক ইউনিটের একত্রে কার্যকারিতা পরীক্ষা করার প্রক্রিয়া, যেখানে পুরো অ্যাপ্লিকেশন বা একটি নির্দিষ্ট লেয়ার (যেমন, ডেটাবেস সংযোগ) পরীক্ষা করা হয়। Spring Boot ORM অ্যাপ্লিকেশনে ডেটাবেস সংক্রান্ত ইনটিগ্রেশন টেস্ট করার জন্য @SpringBootTest, @DataJpaTest, এবং @AutoConfigureTestDatabase ব্যবহার করা হয়।
১. Integration Test for JPA (Database Test)
Spring Boot ORM অ্যাপ্লিকেশনে @DataJpaTest এনোটেশন ব্যবহার করা হয়, যা শুধুমাত্র JPA-র জন্য প্রয়োজনীয় কনফিগারেশন করে এবং টেস্ট রান করার সময় এক্সটার্নাল ডেটাবেস ব্যবহার করা হয় না। Spring Boot H2 Database বা ইন-মেমরি ডেটাবেস ব্যবহার করে এই টেস্ট চালানো যায়।
Dependency for Integration Test (pom.xml):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
User Entity:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
private String email;
// Getters and Setters
}
UserRepository:
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
}
Integration Test:
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@DataJpaTest
public class UserRepositoryIntegrationTest {
@Autowired
private UserRepository userRepository;
@Test
public void testSaveAndFindUser() {
User user = new User(1L, "John Doe", "john.doe@example.com");
userRepository.save(user);
User foundUser = userRepository.findByName("John Doe");
assertNotNull(foundUser);
assertEquals("John Doe", foundUser.getName());
}
}
ব্যাখ্যা:
@DataJpaTestদ্বারা Spring Boot JPA টেস্ট কনফিগার করা হয়, যেখানে H2 বা ইন-মেমরি ডেটাবেস ব্যবহৃত হয়।@Autowiredদ্বারাUserRepositoryইনজেক্ট করা হয়।- টেস্টের মধ্যে একটি
Userঅবজেক্ট তৈরি এবং সেভ করে পরে তা খুঁজে বের করা হয়েছে।
২. Custom Database Configuration for Tests
কিছু ক্ষেত্রে, আপনি ইন-মেমরি ডেটাবেসের পরিবর্তে রিয়েল ডেটাবেস ব্যবহার করতে চাইতে পারেন। এতে @AutoConfigureTestDatabase ব্যবহার করা হয়।
Custom Database Test Example:
import org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class CustomDatabaseIntegrationTest {
// Your test methods here
}
ব্যাখ্যা: @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) ব্যবহার করা হলে টেস্ট চলাকালে ডিফল্ট ইন-মেমরি ডেটাবেসের পরিবর্তে আসল ডেটাবেস ব্যবহার করা হবে।
সারাংশ
Spring Boot ORM এর Unit এবং Integration Testing গুরুত্বপূর্ণ অংশ, যা অ্যাপ্লিকেশন এবং ডেটাবেস লেয়ারের কার্যকারিতা নিশ্চিত করতে সহায়তা করে। Unit Testing সাধারণত Repository এবং Service লেয়ার টেস্ট করতে ব্যবহৃত হয়, যেখানে Mockito মক অবজেক্ট ব্যবহার করা হয়। Integration Testing Spring Boot এর সাথে ডেটাবেস সংক্রান্ত কার্যক্রম পরীক্ষা করতে ব্যবহৃত হয়, যেখানে @DataJpaTest, @SpringBootTest, এবং @AutoConfigureTestDatabase ব্যবহৃত হয়। Unit এবং Integration Testing এর মাধ্যমে ডেভেলপাররা অ্যাপ্লিকেশনকে আরও স্থিতিশীল এবং ভুলমুক্ত রাখতে সক্ষম হয়।
Read more